package com.dhl.fin.api.domain;

import com.dhl.fin.api.common.domain.BasicDomain;
import com.dhl.fin.api.common.exception.BusinessException;
import com.dhl.fin.api.common.util.DateUtil;
import com.dhl.fin.api.common.util.ObjectUtil;
import com.dhl.fin.api.util.CronJobUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.quartz.CronExpression;

import javax.persistence.*;
import java.text.ParseException;
import java.util.Date;

/**
 * @author CuiJianbo
 * @since 2025/5/2
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Entity
@Table(name = "t_remind_task")
public class RemindTask extends BasicDomain {

    private String unicode;

    private String remindName;

    private String remindTypeName;

    private String dateType;

    private String remindCycleWay;

    /**
     * 关系
     */
    private String relationship;

    /**
     * 提醒的日期
     */
    private Date remindDate;

    /**
     * 提醒的时间
     */
    private String remindTime;

    /**
     * 提醒的哪几周
     */
    private String targetWeek;

    /**
     * 是否重复
     */
    private Boolean isMoreTip;

    /**
     * 是否重复
     */
    private Boolean isPrevTip;

    /**
     * 重复次数
     */
    private String timesCycle;

    /**
     * 提前重复次数
     */
    private String prevTimesCycle;

    /**
     * 重复间隔时间
     */
    private String durationTime;

    /**
     * 提前重复间隔时间
     */
    private String prevDurationTime;


    /**
     * 是否设置起止日期
     */
    private Boolean isSetEndDate;

    /**
     * 结束日期
     */
    private Date endDate;

    /**
     * 开始日期
     */
    private Date startDate;

    /**
     * 是否启用
     */
    private Boolean isActive;

    /**
     * 是否置顶显示
     */
    private Boolean isTopShow;

    /**
     * 结束后自动处理方式
     */
    private String autoDealWay;

    /**
     * 贷款类型
     */
    private String loadTypeName;

    /**
     * 每月还款多少钱
     */
    private String loadMoneyPerMonth;

    private String lunarDayIndex;

    private String remindWay;

    private String remark;

    private String cron;


    @ManyToOne
    @JoinColumn(name = "remind_type_id")
    private RemindType remindType;


    public Date getRemindDateTime() {
        String nextDate = String.format("%s %s:00", DateUtil.getTime(remindDate), remindTime);
        return DateUtil.getFullDate(nextDate);
    }

    /**
     * 获取下一次执行时间
     */
    public Date getNextRemindDateTime(Date startDate) {
        CronExpression cron = null;
        if (ObjectUtil.isNull(startDate)) {
            throw new BusinessException("开始日期不能为空");
        }
        try {
            cron = new CronExpression(getCron());
        } catch (ParseException e) {
            throw new BusinessException("cron表达式不正确");
        }
        return cron.getNextValidTimeAfter(startDate);
    }


    /**
     * 获取下一次提醒时间的cron表达式
     */
    public String getNextRemindDateTimeCron(Date startDate) {
         Date nextRemindDateTime = getNextRemindDateTime(startDate);
         return CronJobUtil.dateToCron(nextRemindDateTime);
    }

}
